#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 5e1 + 10;
string s;
int dp[maxn][maxn]; // 合并(涂好) [i,j] 的最少次数

void solve(){
	cin>>s;
	s="0"+s;
	int n =s.length()-1;
	memset(dp, 0x3f, sizeof(dp));
	for (int i=1;i<=n;i++) {
		dp[i][i]=1;
	}
	
	for (int len=2;len<=n;len++) {
		for (int i=1;i+len-1<=n;i++) {
			int j=i+len-1;
			if (s[i]==s[j]) {
				// 这里面直接不用进行区间 DP, 因为可以直接转化为更小的区间
				// 两边字母相同, 说明可以之前一起涂出来
				dp[i][j] = min(dp[i+1][j], dp[i][j-1]);
			} else {
				// 不相同
				// 进行区间分割, 注意这里面不相同时一定要像之前那样进行 区间分割
				for (int k=i;k<j;k++) {
					dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]);					
				}
			}
//			cout <<i<<' '<<j<<' '<<dp[i][j]<<'\n';
		}
	}
	cout << dp[1][n] <<'\n';
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
